// belum beres, butuh mesinkata & custom_string.h

#ifndef filemanager_c
#define filemanager_c

#include "filemanager.h"

TFile TabFile;
string file_opened;
boolean end;

/*#define MaxFile 100*/
//banyak file maksimum 

/*typedef struct {*/
/*	string 	Path;*/
/*	string 	Dir;*/
/*	string 	Name;*/
/*	int 	Size;*/
/*	Time 	Time;*/
/*	Date 	Date;*/
/*} FileProperties;*/
/* Tipe bentukan untuk menyimpan properti file */
/* Path berarti path menuju file tsb misal : C:\tubes\abc.txt 
, sedangkan direktori file tersebut berada adalah C:\tubes */

/*typedef struct {*/
/*	FileProperties T[MaxFile+1];*/
/*	int NFile;*/
/*	} TFile;*/


/*typedef struct {*/
/*	string arguments [MaxCommand+1];*/
/*	int nArg;*/
/*} argument;*/


// file worksheet yang sedang dibuka


//--------------------
//---  Selektor
//--------------------

/*#define name(f) (f).Name*/
/*#define date(f) (f).Date*/
/*#define time(f) (f).Time*/
/*#define size(f) (f).Size*/
/*#define path(f) (f).Path*/
/*#define dir(f)	(f).Dir*/

//--------------------
//---  Primitif
//--------------------

//--------------------
// Inisiasi
//--------------------

void InitFileManager (TFile *TabFile)
/* Mengosongkan isi dari Tabel penyimpan File Properties 
NFile = 0
file_opened = ""*/
{
	(*TabFile).NFile = 0;
	file_opened.length = 0;	
}

TFile ReadTOC (FILE *f)
/* Mengembalikan hasil pembacaan toc.txt dalam bentuk TabFile 
catatan : hati-hati dengan direktori yang berbeda gunakan primitif pada mesinkata.h 
setelah pembacaan file jgn lupa diclose
Parsingnya ribet & cari kondisi utk berhenti baca */
{	
	string temp[5];
	string path;
	argument Arg;
	Arg.nArg = -1;
	while (Arg.nArg!=0) {
		Arg.nArg = 0;
		StartString(f);
		if (cString.length != 0 ) {
			temp[0] = cString;			
			Arg.nArg++;
			while (!end) {
				AdvString(f);
				Arg.nArg++;
				temp[Arg.nArg-1] = cString;
			}
		if (Arg.nArg==1) {
			// adalah nama-direktori file setelah ini disimpan
			path = temp[0];		
			} else {

			printf("\n\npath     = %s\n",path.s);
			printf("namafile = %s\n",temp[0].s);
			printf("tanggal  = %s\n",temp[1].s);
			printf("jam      = %s\n",temp[2].s);
			printf("ukuran   = %s\n",temp[3].s);


			}
		}
	}		
}

//--------------------
// modus 'new'
//--------------------

void AddFile(TFile *f , FileProperties fP);
/* Menambahkan fileproperties baru fP ke TabFile */

//--------------------
// modus 'open'
//--------------------
void OpenFile( FileProperties OpenToken);
/* Membuka File worksheet dengan FileProperties OpenToken
set file_opened = OpenToken */

//--------------------
// modus 'list'
//--------------------

void PrintFileProperties (FileProperties F);
/* menuliskan isi properti file kelayar sesuai dengan format yang diberikan */

void PrintFileList (TFile TabFile);
/* menuliskan isi tabel file ke layar  sesuai dengan format yang diberikan */

TFile SortFileByName(TFile f);
/* Mengembalikan TabFile yang terurut berdasarkan subdirektori kemudian berdasarkan nama */

TFile SortFileByDate(TFile f);
/* Mengembalikan TabFile yang terurut berdasarkan subdirektori kemudian berdasarkan tanggal */

TFile SortFileBySize(TFile f);
/* Mengembalikan TabFile yang terurut berdasarkan subdirektori kemudian berdasarkan size */

//--------------------
// modus 'search'
//--------------------
/* gunakan modus print list */

boolean IsMirip (string A, string B);
/* mengecek apakah string A "mirip" dengan string B 
Definisi string A "mirip" dengan string B adalah string A merupakan substring dari string B yang terletak di awal 
misalkan: "budi" mirip dengan "budianduk" dan "budibadak", tetapi tidak "mirip" dengan "kudabudi" atau "budabudi"
gunakan mesinkata.h */

TFile FilterNama (TFile TabFile , string SearchToken);
/* Mengembalikan tabel file dimana nama dari semua elemen dari tabel tersebut "mirip" dengan SearchToken
Definisi Mirip sudah dijelaskan sebelumnya */

TFile FilterTanggal (TFile TabFile , Date SearchToken);
/* Mengembalikan tabel file dimana date dari semua elemen dari tabel tersebut sama dengan SearchToken
Catatan : Gunakan primitif yang tersedia pada time_n_date.h */

boolean IsDekat (int A, int B);
/* mengecek apakah bilangan X dekat dengan bilangan Y
Definisi X "dekat" dengan Y adalah absolute(X-Y)/Y < 10%  */

TFile FilterSize (TFile TabFile , int SearchToken);
/* Mengembalikan tabel file dimana size dari semua elemen dari tabel tersebut "dekat" dengan SearchToken 
Definisi dekat sudah dijelaskan sebelumnya  */

//--------------------
// modus 'delete'
//--------------------

TFile DeleteFile (TFile TabFile , string DeleteToken);
/* Menghapus file dengan nama file DeleteToken 
penghapusan file hanya dilakukan dengan cara menghapus elemen dengan namaFile DeleteToken pada TabFile (toc.txt)
(tidak benar-benar menghapus dari hardisk) */

//--------------------
// modus 'exit'
//--------------------

void WriteFileListToToc(FILE *f , TFile TabFile);
/* Menulis isi TabFile list ke file toc.txt sesuai dengan format , TabFile disort dulu 
(gunakan SortFileByName) , jangan lupa diclose.. */

//--------------------
// lainnnya
//--------------------

boolean IsFileExist(string fileName);
/* mengecek apakah file yang tertulis pada TOC benar-benar ada atau tidak di hardisk*/

long GetFileSize(FILE *f);
/* Mengembalikan ukuran fisik dari sebuah file */

boolean IsFileNameValid(string NamaFile);
/* Mengecek validitas sebuah nama file dilihat dari karakter penyusun string ,panjang (maksimal 8 karakter,
alpha numerik, tanpa spasi), nama ,dan ekstensi */

#endif
